/* 
 * File:   XMLSceneBuilder.h
 * Author: brady
 *
 * Created on August 16, 2011, 7:52 PM
 */

#ifndef XMLSCENEBUILDER_H
#define	XMLSCENEBUILDER_H

#include <parsing/SceneBuilder.h>
#include <vector>
#include <map>
#include <libxml/xmlreader.h>
#include <libxml/xmlmemory.h>
using namespace std;

class XMLSceneBuilder : public SceneBuilder {
public:
    XMLSceneBuilder();
    XMLSceneBuilder(const XMLSceneBuilder& orig);
    virtual ~XMLSceneBuilder();
    Scene* buildSceneFromFile(const char* inputFile);
private:
    
    vector<Shape*>namedShapes;
    vector<Shader*>namedShaders;
    vector<Texture*>namedTextures;
    

    Shape* parseShape(xmlDocPtr doc, xmlNodePtr cur);
    Shader* parseShader(xmlDocPtr doc, xmlNodePtr cur);
    Sphere* parseSphere(xmlDocPtr doc, xmlNodePtr cur);
    Triangle* parseTriangle(xmlDocPtr doc, xmlNodePtr cur);
    TriangleMesh* parseMesh(xmlDocPtr doc, xmlNodePtr cur);
    Box* parseBox(xmlDocPtr doc, xmlNodePtr cur);
    Instance* parseInstance(xmlDocPtr doc, xmlNodePtr cur);
    LambertianShader* parseLambertianShader(xmlDocPtr doc, xmlNodePtr cur);
    BlinnphongShader* parseBlinnphongShader(xmlDocPtr doc, xmlNodePtr cur);
    DielectricShader* parseDielectricShader(xmlDocPtr doc, xmlNodePtr cur);
    Texture* parseTexture(xmlDocPtr doc, xmlNodePtr cur);
    FlatTexture* parseFlatTexture(xmlDocPtr doc, xmlNodePtr cur);
    MappedTexture* parseMappedTexture(xmlDocPtr doc, xmlNodePtr cur);
    CheckerTexture* parseCheckerTexture(xmlDocPtr doc, xmlNodePtr cur);
    Vector3D parseAmbientLight(xmlDocPtr doc, xmlNodePtr cur);
    Light* parseLight(xmlDocPtr doc, xmlNodePtr cur);
    PointLight* parsePointLight(xmlDocPtr doc, xmlNodePtr cur);
    AreaLight* parseAreaLight(xmlDocPtr doc, xmlNodePtr cur);
    Vector3D parseBackground(xmlDocPtr doc, xmlNodePtr cur);
    Vector3D parseSolidBackground(xmlDocPtr doc, xmlNodePtr cur);
    Camera* parseCamera(xmlDocPtr doc, xmlNodePtr cur);
    Vector3D parseVector(xmlDocPtr doc, xmlNodePtr cur);
    xmlNodePtr getNodeById(xmlDocPtr doc, xmlNodePtr start, xmlChar* id);
    xmlNodePtr getRefNode(xmlDocPtr doc, xmlNodePtr cur);
    bool nodeNameEquals(xmlNodePtr cur, const char* type);
    bool keyCmp (const char* lhs, const char* rhs) {return strcmp(lhs, rhs) < 0;}
    void* findObjectByKey(const char* key);
    void indexObject(const char* key, void* value);
    Shape* getIndexedShape(const char* key);
    Shader* getIndexedShader(const char* key);
    Texture* getIndexedTexture(const char* key);


};

#endif	/* XMLSCENEBUILDER_H */

